/*操作数据库常用方法的封装*/

var MongoClient = require('mongodb').MongoClient;

var url = require("./baseUrl").mongodb; //数据库地址  mongodb/bin/mongo.exe

function databasePublic() {
  this.init();
};

databasePublic.prototype.init = function () {
  this.url = url;
  this.MongoClient = MongoClient;
};



/**
 * 公共函数
 * 
 * @param {*} library  库名称
 * @param {*} fn      回调函数 入参为 database
 * 
 */
databasePublic.prototype.public = function (library, fn) {
  this.MongoClient.connect(this.url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;
    var database = db.db(library);
    fn && fn(database, db);
  });
}

/**
 * 创建集合
 * obj
 * 
 * @param {*} library     库名称
 * @param {*} listName    集合名称
 * 
 */
databasePublic.prototype.createCollection = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      database.createCollection(obj.listName, (err, res) => {
        err ? reject(err) : resolve(res)
        db.close();
      });
    })
  })
};

/**
 * 删除集合
 * obj
 * 
 * @param {*} library     库名称
 * @param {*} listName    集合名称
 * 
 */
databasePublic.prototype.drop = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      database.collection(obj.listName).drop((err, res) => {
        err ? reject(err) : resolve(res)
        db.close();
      });
    })
  })
};



/**
 * 插入单条
 * obj
 * @param {*} library      库名称
 * @param {*} listName     集合名称
 * @param {*} message      插入的数据
 */
databasePublic.prototype.insertOne = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      database.collection(obj.listName).insertOne(obj.message, (err, res) => {
        err ? reject(err) : resolve(res);
        db.close();
      });
    })
  })
};

/**
 * 插入多条
 * obj
 * @param {*} library      库名称
 * @param {*} listName     集合名称
 * @param {*} list         插入的数据
 * 
 */
databasePublic.prototype.insertMany = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      database.collection(obj.listName).insertMany(obj.list, (err, res) => {
        err ? reject(err) : resolve(res);
        db.close();
      });
    })
  })
};

/**
 * 查询数据
 * obj
 * @param {*} library      库名称
 * @param {*} listName     集合名称
 * @param {*} whereStr     查询的数据信息
 * 
 */
databasePublic.prototype.find = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      var whereStr = obj.whereStr || ""; //不传查所有
      database.collection(obj.listName).find(whereStr).toArray((err, res) => {
        err ? reject(err) : resolve(res);
        db.close();
      });
    })
  })
};

/**
 * 更新数据
 * obj
 * 
 * @param {*} library      库名称
 * @param {*} listName     集合名称
 * @param {*} whereStr     查询的数据信息
 * @param {*} updateStr    更新的数据
 * 
 */
databasePublic.prototype.updateOne = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      database.collection(obj.listName).updateOne(obj.whereStr, { $set: obj.updateStr }, (err, res) => {
        err ? reject(err) : resolve(res);
        db.close();
      });
    })
  })
};

/**
 * 更新多条数据
 * obj
 * 
 * @param {*} library      库名称
 * @param {*} listName     集合名称
 * @param {*} whereStr     查询的数据信息
 * @param {*} updateStr    更新的数据
 * 
 */
databasePublic.prototype.updateMany = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      database.collection(obj.listName).updateMany(obj.whereStr, obj.updateStr, (err, res) => {
        err ? reject(err) : resolve(res);
        db.close();
      });
    })
  });
};


/**
 * 删除数据
 * obj
 * 
 * @param {*} library      库名称
 * @param {*} listName     集合名称
 * @param {*} whereStr     查询的数据信息
 * 
 */
databasePublic.prototype.deleteOne = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      database.collection(obj.listName).deleteOne(obj.whereStr, (err, res) => {
        err ? reject(err) : resolve(res);
        db.close();
      });
    })
  })
};

/**
 * 删除多条数据
 * obj
 * 
 * @param {*} library      库名称
 * @param {*} listName     集合名称
 * @param {*} whereStr     查询的数据信息
 */
databasePublic.prototype.deleteMany = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      database.collection(obj.listName).deleteMany(obj.whereStr, (err, res) => {
        err ? reject(err) : resolve(res);
        db.close();
      });
    })
  })
};

/**
 * 排序返回
 * obj
 * 
 * @param {*} library      库名称
 * @param {*} listName     集合名称
 * @param {*} whereStr     查询的数据信息
 * @param {*} sortType     按照那个字段排序  { type: 1 } 按type升序  { type: -1 } 按type降序 
 * 
 */
databasePublic.prototype.sort = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      var whereStr = obj.whereStr || "";
      database.collection(obj.listName).find(whereStr).sort(obj.sortType).toArray((err, res) => {
        err ? reject(err) : resolve(res);
        db.close();
      });
    })
  })
};


/**
 * 分页查询
 * obj
 * 
 * @param {*} library      库名称
 * @param {*} listName     集合名称
 * @param {*} whereStr     查询的数据信息
 * @param {*} pageNum      查询的数据信息
 * @param {*} pageSize     查询的数据信息
 * 
 */
databasePublic.prototype.paging = function (obj) {
  return new Promise((resolve, reject) => {
    this.public(obj.library, (database, db) => {
      var whereStr = obj.whereStr || ""; //查询字段
      var pageNum = obj.pageNum || 1;  //页码
      var pageSize = obj.pageSize || 10; //每页数量
      var skipNum = (pageNum - 1) * pageSize; //计算跳转几条
      database.collection(obj.listName).find(whereStr).skip(skipNum).limit(pageSize).toArray((err, res) => {
        err ? reject(err) : resolve(res);
        db.close();
      });
    })
  })
};

/**
 *  链式调用
 * 
 *  find   查
 *  skip   跳过前面的几项
 *  limit  查询几项
 *  sort   排序
 * 
 * */
module.exports = databasePublic;